"; // Формуємо посилання на рівень вище
}
// Форматуємо назву поточної папки
$find = ["_", " "]; // Чистимо назву
$replace = " ";
$current_name = str_replace($find, $replace, mb_strtoupper(basename(__DIR__)));
// Допоміжні файли assets
$folderAssets = './assets/';
// Перевірка, чи папка assets вже існує
if (!file_exists($folderAssets)) {
// Створення папки
mkdir($folderAssets, 0777, true);
}
$folderPic = $folderAssets.'picture/';
// Перевірка, чи папка picture вже існує
if (!file_exists($folderPic)) {
// Створення папки
mkdir($folderPic, 0777, true);
}
// Опис теки (додати при необхідності).
$file_agreement = $folderAssets."agreement.txt"; // Місце для збереження файла agreement.txt
$put_date = 'The directory has been created: '.date('d-m-Y H:i').'
[En] Stub script for folders that do not have an index file.';
$put_agreement = '
Agreement
The '.$current_name.' section is created for personal use. The scripts are written for private purposes, and the ideas are taken from open sources and reworked for the purpose of coding practice. We adhere to the CC Zero principles, which allow anyone to freely distribute, adapt, or modify materials on their own media without additional conditions. You are free to view any information and share links with others, however, please note that we reserve the right to change pages without notice.
Disclaimers
The software is provided "as is" without any warranties of any kind, either express or implied. Under no circumstances will the authors or copyright holders be liable for any damages or other claims arising from the use of the software or other actions. For correspondence and suggestions '.'
';
// Для запису в файл видаляємо теги, табуляцію і додаємо перевід строки
$text_agreement = strip_tags(str_replace("\t", "", $put_agreement)).$version;
if (!file_exists($file_agreement)) {
file_put_contents($file_agreement, $put_date.'
'.$text_agreement);
}
// Статистика сторінки
$folderStats = $folderAssets.'stats/';
// Перевірка, чи папка статистики вже існує
if (!file_exists($folderStats)) {
// Створення папки
mkdir($folderStats, 0777, true);
}
// Отримання IP-адреси клієнта
$ip = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
// Хешування IP-адреси
$hashed_ip = hash('sha256', $ip);
// Отримання поточної дати та дати вчорашнього дня
$today = date('d-m-Y');
$yesterday = date('d-m-Y', strtotime('-1 day'));
// Визначення імен файлів
$hash_db = $folderStats.'hash_db.json';
$count_db = $folderStats.'count_db.json';
// Відкриття файлу для блокування
$lock_file = fopen($folderStats."lockfile.txt", "w+");
// Спроба отримати виключне блокування
if(flock($lock_file, LOCK_EX)) {
// Читання та декодування вмісту файлів
$decodedHashJson = file_exists($hash_db) ? json_decode(file_get_contents($hash_db), true) : [];
$decodedCountJson = file_exists($count_db) ? json_decode(file_get_contents($count_db), true) : [];
// Ініціалізація масиву для поточного дня, якщо він не існує
if (!isset($decodedHashJson[$today])) {
$decodedHashJson[$today] = [];
}
// Якщо хеш IP-адреси не в масиві для поточного дня, додати його та збільшити лічильник
if (!in_array($hashed_ip, $decodedHashJson[$today])) {
$decodedHashJson[$today][] = $hashed_ip;
$decodedCountJson[$today] = isset($decodedCountJson[$today]) ? $decodedCountJson[$today] + 1 : 1;
$decodedCountJson["total"] = isset($decodedCountJson["total"]) ? $decodedCountJson["total"] + 1 : 1;
}
// Запис вмісту назад у файли
file_put_contents($hash_db, json_encode($decodedHashJson, JSON_PRETTY_PRINT));
file_put_contents($count_db, json_encode($decodedCountJson, JSON_PRETTY_PRINT));
// Визначення дня з максимальною кількістю відвідувачів
$max_visitors = 0;
$max_day = "";
foreach($decodedCountJson as $day => $visitors) {
if($day == "total") continue;
if($visitors > $max_visitors) {
$max_visitors = $visitors;
$max_day = $day;
}
}
// Зняття блокування
flock($lock_file, LOCK_UN);
}
// Закриття файлу блокування
fclose($lock_file);
// Інформація про версію РНР
if(!empty($_GET['phpinfo'])) {
phpinfo();
exit;
}
// Інформація про сервер
$host_version = $_SERVER['SERVER_NAME'];
$apache_version = explode(' ', explode('/', $_SERVER['SERVER_SOFTWARE'])[1])[0];
$php_version = explode('-', phpversion())[0];
$mysql_version = explode('-', explode(' ', mysqli_get_client_info())[1])[0];
// Інформація про сертифікат SSL
$url_ssl = 'ssl://' . $host_version . ':443';
$context = stream_context_create(array(
'ssl' => array(
'capture_peer_cert' => true,
'verify_peer' => false, // так як проміжний сертифікат може бути відсутній,
'verify_peer_name' => false // то вимикаємо його перевірку.
)
));
$fp = stream_socket_client($url_ssl, $err_no, $err_str, 30, STREAM_CLIENT_CONNECT, $context);
$cert = stream_context_get_params($fp);
if (empty($err_no))
{
$ssl = openssl_x509_parse($cert['options']['ssl']['peer_certificate']);
$ssl_center = $ssl['issuer']['CN'];
$ssl_date = date('d.m.Y', $ssl['validTo_time_t']);
}
if ($apache_version == "" or $mysql_version == ""){
$server = [
// На випадок, якщо в налаштуваннях серверу Apache у файлі httpd.conf не встановлений параметр: ServerTokens Minimal
'Host' => $host_version,
'SSL to' => $ssl_date, // Дія сертифікату SSL
'Software' => $_SERVER['SERVER_SOFTWARE'],
'Time zone' => date_default_timezone_get(),
'Protocol' => $_SERVER['SERVER_PROTOCOL']
];} else {
$server = [
'Host' => $host_version,
'SSL to' => $ssl_date, // Дія сертифікату SSL
'Apache' => $apache_version,
'PHP' => $php_version,
'MySQL' => $mysql_version,
];}
// Розмір теки з вкладеними файлами
function folderSize ($dir)
{
$size = 0;
foreach (glob(rtrim($dir, '/').'/*', GLOB_NOSORT) as $each) {
$size += is_file($each) ? filesize($each) : folderSize($each);
}
return sizeFilter($size);
}
// Розмірність в байтах
function sizeFilter($bytes)
{
$label = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
for ($i = 0; $bytes >= 1024 && $i < (count($label) - 1); $bytes /= 1024, $i++);
return (round($bytes, 2) . " " . $label[$i]);
}
// Перевірка імені файлу по масиву шаблонів виключень
function filenameMatch($patternArray, $filename) {
if (empty($patternArray)) {
return false;
}
foreach ($patternArray as $pattern) {
if (fnmatch($pattern, $filename)) {
return true;
}
}
return false;
}
// Перебір всіх елементів у поточній папці
$directory_list = [];
if($handle = opendir('./')) {
$item_list = [];
while(false !== ($item = readdir($handle))) {
if($item == '..' || $item == '.' || filenameMatch($options['exclusion'], $item)) {
continue;
}
$item_type = is_dir($item) ? 'dir' : 'file';
$order = ($item_type == 'dir') ? 1 : 0;
$item_list[] = [
'name' => $item,
'type' => $item_type,
'order' => $order
];
}
$order_column = array_column($item_list, 'order');
array_multisort($order_column, SORT_DESC, $item_list);
$directory_list = $item_list;
closedir($handle);
}
// Ініціалізація змінних
$dir_list = '';
$file_list = '';
// Формування списку файлів і папок
foreach ($directory_list as $item) {
$items = $item['name'];
$string = str_replace($find, $replace, $items);
if ($item['type'] == 'dir') { // Формуємо список папок
$string = strtoupper($string);
$folderSize = '― dir ―';
// $folderSize = folderSize($items); // Якщо потрібен розмір папки, розкоментуйте цей рядок
if (is_dir($items)) {
$dir = '
';
$file_list = $file_list . $file;
}
}
}
$file_List = $dir_list . $file_list;
// Скорочені дані про браузер
$browser = get_browser_name($_SERVER['HTTP_USER_AGENT']);
function get_browser_name($user_agent)
{
// Робимо пошук нечутливим до регістру
$t = strtolower($user_agent);
// Визначаємо патерни для різних браузерів та ботів
$browsers = [
'opera' => 'Opera',
'opr/' => 'Opera',
'edge' => 'Edge',
'chrome' => 'Chrome',
'safari' => 'Safari',
'firefox' => 'Firefox',
'msie' => 'Internet Explorer',
'trident/7' => 'Internet Explorer',
'google' => '[Bot] Googlebot',
'bing' => '[Bot] Bingbot',
'slurp' => '[Bot] Yahoo! Slurp',
'duckduckgo'=> '[Bot] DuckDuckBot',
'baidu' => '[Bot] Baidu',
'yandex' => '[Bot] Yandex',
'sogou' => '[Bot] Sogou',
'exabot' => '[Bot] Exabot',
'msn' => '[Bot] MSN',
'mj12bot' => '[Bot] Majestic',
'ahrefs' => '[Bot] Ahrefs',
'semrush' => '[Bot] SEMRush',
'rogerbot' => '[Bot] Moz or OpenSiteExplorer',
'dotbot' => '[Bot] Moz or OpenSiteExplorer',
'frog' => '[Bot] Screaming Frog',
'screaming' => '[Bot] Screaming Frog',
'facebook' => '[Bot] Facebook',
'pinterest' => '[Bot] Pinterest',
];
foreach ($browsers as $key => $value) {
if (stripos($t, $key) !== false) {
return $value;
}
}
// Перевірка на наявність рядків, які використовуються в агентах користувачів ботів
$bot_indicators = ['crawler', 'api', 'spider', 'http', 'bot', 'archive', 'info', 'data'];
foreach ($bot_indicators as $indicator) {
if (stripos($t, $indicator) !== false) {
return '[Bot] Other';
}
}
return 'Other (UNKNOWN)';
}
// Скорочені дані про юзера, отримані через IP
function get_ip() {
$ip_keys = [
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'REMOTE_ADDR'
];
foreach ($ip_keys as $key) {
if (!empty($_SERVER[$key])) {
// Якщо це 'HTTP_X_FORWARDED_FOR', обробляємо кілька IP-адрес
if ($key === 'HTTP_X_FORWARDED_FOR') {
$ips = explode(',', $_SERVER[$key]);
foreach ($ips as $ip) {
$ip = trim($ip); // Видаляємо пробіли
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
// Перевіряємо, чи не є це IP-адреса localhost
if ($ip !== '127.0.0.1') {
return $ip;
}
}
}
} else {
if (filter_var($_SERVER[$key], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
// Перевіряємо, чи не є це IP-адреса localhost
if ($_SERVER[$key] !== '127.0.0.1') {
return $_SERVER[$key];
}
}
}
}
}
return '127.0.0.1'; // Повертаємо localhost, якщо жоден інший IP не знайдено
}
$ip = get_ip(); // IP-адреса
// Ініціалізуємо cURL-ресурс
$ch = curl_init();
// Встановлюємо URL-адресу для запиту
curl_setopt($ch, CURLOPT_URL, "http://www.geoplugin.net/json.gp?ip=".$ip);
// Повертати результат, а не виводити його в браузер
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Виконуємо запит
$file = curl_exec($ch);
// Перевіряємо наявність помилки під час виконання запиту
if ($file === false) {
echo 'Помилка отримання даних geoplugin.net!';
exit;
}
// Декодуємо отриманий JSON
$ipdat = json_decode($file);
// Перевіряємо наявність помилки при декодуванні JSON
if (!$ipdat) {
echo 'Помилка декодування даних geoplugin.net!';
exit;
}
// Закриваємо cURL-ресурс
curl_close($ch);
// Отримані дані доступні в змінній $ipdat
// На випадок, якщо у виводі не потрібен параметр, його можна закоментувать
$user = [
'Addr IP' => $ip,
'Continent' => $ipdat->geoplugin_continentName,
'Country' => $ipdat->geoplugin_countryName,
'City' => $ipdat->geoplugin_city,
// 'Lat' => $ipdat->geoplugin_latitude,
// 'Long' => $ipdat->geoplugin_longitude,
// 'Сurrency symbol' => $ipdat->geoplugin_currencySymbol,
// 'Currency code' => $ipdat->geoplugin_currencyCode,
'Time zone' => $ipdat->geoplugin_timezone,
'Browser' => $browser
];
// Формування таблиці PAGE INFO
if ($decodedCountJson[$yesterday] == '') {$decodedCountJson[$yesterday] = 'none';}
$info = '
Total visits
'.$decodedCountJson["total"].'
Today\'s visitors
'.$decodedCountJson[$today].'
Yesterday\'s visitors
'.$decodedCountJson[$yesterday].'
';
// Змінна для виводу
$stat_info = '
'.$info.'
With '.$max_visitors.' visitors, '.$max_day.' was the day with most traffic.
';
// Формування таблиці USER INFO
$info = $td = $label = $value = ""; // Чистимо сміття у змінних
foreach($user as $label => $value){
if (!empty($value)){
$td = '
'.$label.'
'.$value.'
';
$info = $info.'
'.$td.'
';
}
}
// Змінна для виводу
$user_info = '
'.$info.'
';
// Формування таблиці SERVER INFO
$info = $td = $label = $value = ""; // Чистимо сміття у змінних
foreach($server as $label => $value){
if (!empty($value)){
$td = '
'.$label.'
'.$value.'
';
$info = $info.'
'.$td.'
';
}
}
// Змінна для виводу
$server_info = '
'.$info.'
';
?>
= $current_name ?>
= $current_name ?>
= $up ?>
= $file_List ?>
The table shows a list of directories and files available for viewing in this scenario, directory caching is not used, so the list is generated on the fly. The required level of protection is provided by the configuration of the .htaccess file.